/************************************************************************
** 文  件：
**	DBPoll.h
** 功  能：
**	数据库连接池，提供数据库连接池的获取、释放等管理
** 作  者：
**	email:lixx2048@163.com
**  wechat:lixiang6153
**  QQ:941415509
** 日  期：
**	2020/10/15	14:00:00
** 说  明：
**	无
** 版  本：
**	2020/10/15	14:00:00		1.0		lixx2048@163.com
** 使用指南：
*	// 初始化数据库
	CDBConfig config = CConfig::get_mutable_instance().GetDBConfig();
	CDBPoll::get_mutable_instance().Init(1, config.GetType(), config.GetIp(), config.GetPort(), config.GetUser(), config.GetPwd(), config.GetDb());
	CDBPoll::get_mutable_instance().CreateTables();

	#define SQL_CREATE_RECORD		"create table if not exists t_time_record(id bigint(20) NOT NULL AUTO_INCREMENT primary key, device varchar(64), channel int, stream int, type int, path varchar(256), format int, start datetime default null, end datetime default null, size int, finish tinyint default 0, sync tinyint default 0, deleted tinyint default 0)"
	#define SQL_CREATE_RECORD_LITE	"create table if not exists t_time_record(id INTEGER NOT NULL primary key AUTOINCREMENT, device varchar(64), channel int, stream int, type int, path varchar(256), format int, start datetime default null, end datetime default null, size int, finish tinyint default 0, sync tinyint default 0, deleted tinyint default 0)"

	// 数据库使用
	IDbBasePtr db = CDBPoll::get_mutable_instance().Pop();
	if (db)
	{
		std::string sql = db->GetDbType() == 0 ? SQL_CREATE_RECORD : SQL_CREATE_RECORD_LITE;
		bool ret = db->CreateTable(sql.c_str());
		CDBPoll::get_mutable_instance().Push(db);
		return ret;
	}

	// 卸载数据库
	CDBPoll::get_mutable_instance().Close();
/************************************************************************/
#pragma once
#include <boost/serialization/singleton.hpp>
#include <list>
#include <vector>
#include <condition_variable>
#include "IDbBase.h"
#include "DbMySql.h"
#include "DbSqlite.h"

class DBPoll
	: public boost::serialization::singleton<DBPoll>
{
public:
	DBPoll();
	virtual ~DBPoll();

public:
	void Init(int size, int type, std::string ip, int port, std::string user, std::string pwd, std::string db);
	void CreateTables();
	void InitDefaultData();
	void Close();

public:
	void Push(IDbBasePtr db);
	IDbBasePtr Pop();

private:
	bool IsFull();
	bool IsEmpty();

private:
	int							m_max_size;
	std::mutex					m_monitor;
	std::condition_variable		m_empty;
	std::condition_variable		m_full;
	std::list<IDbBasePtr>		m_list;
};